home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Software Contest 3
/
FM Towns Software Contest 3.iso
/
exp
/
bpp
/
no1
/
bppbe.doc
< prev
next >
Wrap
Text File
|
1994-01-07
|
8KB
|
316 lines
BPP入門
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
☆ ☆
☆ BPP 入門 ☆
☆ ☆
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
------ 目次 ------
§1 マクロを使おう - 2 -
§2 ブロック構文を使おう - 3 -
§3 定義サブルーチンを使おう - 6 -
- 1 -
BPP入門
▼△ §1 マクロを使おう △▼
「マクロって何だ?」と、早速首をひねっている人もあるかもしれませんが、論よ
り証拠、とりあえずやってみましょう。次のようなプログラムがあるときあなたな
らどうしますか?
D$にはあるデータベースファイルの一部が入っていて、3桁の数字+文字列の形
式でデータが格納されている。
D$から数字部分と文字列部分を切り分けて、文字列を配列R$(数字)に代入せ
よ。
<D$>の例
D$ = "012 This is a pen."
BPPでは行番号がありませんから、普通に書くとこうなります。
N$ = LEFT$ ( D$ , 3 )
S$ = MID$ ( D$ , 4 )
R$ ( VAL ( N$ ) ) = S$
ところがこれをプログラム中のあちこちで使うとすれば、結構面倒ですよね。
また、変数名が変更されたときも面倒です。では次の例ではどうでしょう。
DEF FNN ( X$ ) = VAL ( LEFT$ ( X$ , 3 ) )
DEF FNS$ ( X$ ) = MID$ ( X$ , 4 )
:
:
R$ ( FNN ( D$ ) ) = FNS$ ( X$ )
これでもまだ回りくどい感じがします。
さりとて、サブルーチンにするほどの事もなさそうです。
ここで、BPPの強力なマクロ機能を使えば、問題は解決します。
#DEFINE STORE ( X ) R$ ( VAL ( LEFT$ ( X , 3 ) ) ) = MID$ ( X , 4 )
:
:
STORE ( D$ )
随分すっきりしましたね。
マクロ置換はDEF FNと違って、仮引数に変数の型をつけてはいけません。
DEF FNはBASICの命令として解釈されますが、#DEFINEによるマ
クロ置換はSEDなどと同じで、単なるテキスト置換です。
マクロは、次のような置換も出来ます。
#DEFINE MAX 10
DIM FOO ( MAX ) , BAR ( MAX )
:
:
プログラム中のMAXは全て10に置換されます。
- 2 -
BPP入門
▼△ §2 ブロック構文を使おう △▼
次のフローチャート(もどき)を見てください。
OCCCCCCCCCCCCCCCCS
E FLAGが1か _CCCCCCCCCCCCCCCS
WCCCCCCCCoCCCCCCC[ E
E E
OCCCCCwCCCCCS OCCCCCwCCCCCS
E 処理 1 E E 処理 2 E
WCCCCCoCCCCC[ WCCCCCoCCCCC[
E E
_CCCCCCCCCCCCCCCCCCCCCCC[
E
OCCCCCCCCCCCCCCCCS
E 次の処理 E
WCCCCCCCCCCCCCCCC[
これをBASICのプログラムにすると、
IF FLAG = 1 THEN 処理1 ELSE 処理2
次の処理
となります。でも、処理1や処理2が1行に書き切れない場合はどうしますか?
こういう方法があります。
IF FLAG <> 1 THEN *FLAGNOT1
処理1
GOTO *NEXTPROCESS
*FLAGNOT1
処理2
*NEXTPROCESS
GOTOが多くて読みにくくなってしまいました。
BPPなら次のように書くことが出来ます。
IF FLAG = 1 THEN
処理1
ELSE
処理2
ENDIF
これで随分読みやすくなりました。このような構文をブロックIFと呼びます。
ブロックIFでも通常のIF文と同じ様にELSE節を省略できますが、
ENDIFは省略できません。
では、次のような場合はどうしたらよいでしょう。
A$が”A”のときは処理A
”B”のときは処理B
:
:
- 3 -
BPP入門
これを前のようにプログラムにすると、
IF A$ = "A" THEN
処理A
ELSE
IF A$ = "B" THEN
処理B
ELSE
IF A= "C" THEN
処理C
ELSE
:
:
ENDIF
ENDIF
ENDIF
これはまた読みにくいですね。
この場合は、次のように書くことが出来ます。
IF A$ = "A" THEN
処理A
ELSEIF A$ = "B" THEN
処理B
ELSEIF A$ = "C" THEN
処理C
ELSEIF A$ = "D" THEN
:
:
ENDIF
ELSEIFは、ELSEとIFをまとめたもので、このような場合にとても便利
です。
今度は次の例を見てください。
OPEN "FILE.TXT" FOR INPUT AS #1
FOR I = 1 TO 10
IF EOF(1) THEN *QUIT
LINE INPUT#1 , L$
PRINT L$
NEXT
*QUIT
CLOSE
END
これは、FILE.TXTの先頭から10行を表示するプログラムです。
FILE.TXTの長さが10行未満の時にはファイルの終わりで打ち切ります。
ここでは、ファイルの終わりをEOF関数で検出してGOTOでループを抜けてい
ますが、このGOTOもBPPでは不要です。
- 4 -
BPP入門
OPEN "FILE.TXT" FORINPUT AS #1
FOR I=1 TO 10
IF EOF(1) THEN BREAK
LINE INPUT#1 , L$
PRINT L$
NEXT
CLOSE
END
BREAKは、FOR、WHILE、DOのループを1段抜け出します。
BPPにはCライクなFOR文があり、それを使えばもっとすっきりします。
OPEN "FILE.TXT" FOR INPUT AS #1
FOR I = 1 , I < 10 AND EOF(1) = 0 , I = I + 1
LINE INPUT#1 , L$
PRINT L$
NEXT
CLOSE
END
この書き方だと、ループの終了条件がよりはっきりしますね。
これをWHILEをつかって書き換えてみると、動作がはっきりします。
OPEN "FILE.TXT" FOR INPUT AS #1
I = 1 '←FOR文の1番目の式
WHILE I <= 10 AND EOF(1) = 0 '←2番目の式
LINE INPUT#1 ,L$
PRINT L$
I = I + 1
WEND
CLOSE
END
ここではDO~LOOPは使えません。
WHILE~WENDでは、 ループ本体を実行する前に条件式を評価しますが、
DO~LOOPは、ループ本体を実行した後で条件式を評価します。
この場合、DO~LOOPを使うと、”FILE. TXT” の大きさが0のとき
(内容が空のとき)LINE INPUT#文でエラーが発生してしまいます。
逆に次のような場合は、WHILE~WENDでは不都合です。
WHILE A$ = ""
A$ = INKEY$ '←実行されない。
WEND
これは何かキーが押されるまで末というプログラムですが、もしA$が始めから空
(””)だったら、ループの中身は実行されませんから何もキーが押されなくても
先に進んでしまいます。
DO
A$ = INKEY$
LOOP A$ = ""
これが正しい形です。
- 5 -